/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __67DCBB6C_07D9_4d43_8E1A_E17D9D185BAF__
#define __67DCBB6C_07D9_4d43_8E1A_E17D9D185BAF__

#include "../tools/head.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos
{

    class file_impl;

    // 
    // dir_impl
    // 
    class dir_impl : public xos_stl::mem_item< release_impl< dir_impl >, thread_lock >,
        public i_dir
    {
    public:
        typedef release_impl< dir_impl > T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        static int get_xos_item_data( ITEM_DATA*& item_ptr );

    public:
        dir_impl();
        ~dir_impl();

    public:
        int init();
        int term();

    public:
        //////////////////////////////////////////////////////////////////////////////////
        // 
        // get full file name path
        // 
        int get_file_path( char * lpszPath, int nLen, const char * lpszFile );

        // 
        // create dir and sub dirs
        // 
        int create_directory( const char * lpszPath );

        // 
        // delete dir and sub dirs
        // 
        int delete_directory( const char * lpszPath );

        // 
        // if a dir exists
        // 
        int is_dir_exist( const char * lpszPath );

        //////////////////////////////////////////////////////////////////////////////////// 
        // 
        // scan all dirs and files into property:
        // 
        //   dirs : *xos_box::i_str_property
        //   file : *i_file
        // 
        // nDepth : 
        //    -1  : no limit
        //     0  : no scan
        //  other : depth
        // 
        // if lpszPath do not exitst, *ppv is null
        // 
        int scan_dir_and_files( enumFileType eType, const char * lpszExtFilter, const char* lpszPath, xos_box::i_str_property** ppv, int nDepth );

        //////////////////////////////////////////////////////////////////////////////////

        // 
        // get file size and time
        // 
        int get_file_size_and_time( const char * lpszFile, int64_t * lpSize64, int64_t * lpCreateTime, int64_t * lpAccessTime, int64_t * lpModifyTime );

        // 
        // 设置文件时间。linux32下create time无效
        // 
        int set_file_time( const char * lpszFile, int64_t cTime, int64_t aTime, int64_t mTime );

        // 
        // if a file exists
        // 
        int is_file_exist( const char * lpszFileName );

        // 
        // delete a file
        // 
        int delete_file( const char * lpszFileName );

        // 
        // rename a file
        // 
        int rename_file( const char * lpszDesName, const char * lpszSrcName );
    };
} // xos

#endif // __67DCBB6C_07D9_4d43_8E1A_E17D9D185BAF__
